package br.com.sms.action;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.ServletActionContext;
import org.apache.struts2.components.FieldError;

import br.com.sms.dominio.Cliente;
import br.com.sms.dominio.Funcionalidade;
import br.com.sms.dominio.Usuario;
import br.com.sms.enuns.TipoFuncionalidade;
import br.com.sms.facade.CidadeFacade;
import br.com.sms.facade.ClienteFacade;
import br.com.sms.facade.DestinatarioFacade;
import br.com.sms.facade.MalaDiretaFacade;
import br.com.sms.facade.MensagemFacade;
import br.com.sms.facade.PerfilFacade;
import br.com.sms.facade.UsuarioFacade;
import br.com.sms.util.Util;
import br.com.sms.util.UtilArquivo;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

@SuppressWarnings("serial")
public class Action extends ActionSupport {

	/*Menu*/
	public static final int MENU_ADMINISTRACAO = 1;
	public static final int MENU_MALA_DIRETA = 2;
	public static final int MENU_MENSAGEM = 3;
	public static final int MENU_CONTATOS = 4;
	public static final int MENU_CLIENTES = 5;

	/*Objetos da sessao*/
	public static final String USUARIO_LOGADO = "usuarioLogado";
	public static final String MALA_SESSAO = "malaDireta";

	/*Mensagem*/
	public static final String TELA_NOVA_MENSAGEM = "telaNovaMensagem";
	public static final String TELA_LISTAR_MENSAGEM = "telaListarMensagem";
	public static final String RECUPERAR_MENSAGEM = "recuperarMensagem";


	/*Usuário*/
	public static final String LISTAR_USUARIOS = "listarUsuario";
	public static final String TELA_LISTA_USUARIO = "telaListaUsuario";
	public static final String TELA_NOVO_USUARIO = "telaNovoUsuario";
	public static final String TELA_CADASTRO_USUARIO = "telaCadastroUsuario";

	/*Perfil*/
	public static final String TELA_NOVO_PERFIL = "telaNovoPerfil";
	public static final String TELA_LISTA_PERFIL = "telaListaPerfil";
	public static final String LISTAR_PERFIS = "listarPerfis";
	public static final String TELA_EDICAO_PERFIL = "telaEdicaoPerfil";

	/*Mala Direta*/
	public static final String TELA_MALA_DIRETA = "telaMalaDireta";
	public static final String TELA_MALA_ENVIADAS = "malasEnviadas";
	public static final String TELA_MENU_MALA_DIRETA = "telaMenuMalaDireta";
	public static final String LISTAR_MALAS_DIRETAS = "listarMalaDiretas";
	public static final String TELA_EDICAO_MALA_DIRETA = "telaEdicaoMalaDireta";
	public static final String TELA_LISTAR_MALAS_DIRETAS = "listarMalasDiretas";

	/*Carga usuario*/
	public static final String TELA_CARGA_USUARIO = "telaCargaUsuario";
	public static final String TELA_RESULTADO_IMPORTACAO = "telaResultadoImportacao";
	public static final String TELA_CONFIRMA_CARGA_USUARIO = "telaConfirmarCargaUsuario";

	public static final String TELA_INICIAL = "telaInicial";
	public static final String TELA_VISUALIZAR_DESTINATARIO = "telaVisualizarDestinatario";
	public static final String TELA_LOGIN = "telaLogin";
	public static final String TELA_ETIQUETA = "telaEtiqueta";
	public static final String TELA_MENU_ADM = "telaMenuAdm";
	public static final String TELA_MENU_MENSAGEM = "telaMenuMensagem";

	//CONTATO
	public static final String TELA_MENU_CONTATOS = "telaMenuContatos";
	public static final String TELA_SALVAR_CONTATO = "telaSalvarContato";

	//CLIENTE
	public static final String TELA_PESQUISAR_CLIENTES = "telaPesquisarClientes";
	public static final String TELA_SALVAR_CLIENTE = "telaSalvarCliente";

	protected Map<String, String> erros = new HashMap<String, String>();
	protected Map<String, String> mensagens = new HashMap<String, String>();


	private MensagemFacade mensagemFacade;
	private DestinatarioFacade destinatarioFacade;
	private UsuarioFacade usuarioFacade;
	private CidadeFacade cidadeFacade;
	private MalaDiretaFacade malaDiretaFacade;
	private PerfilFacade perfilFacade;
	private ClienteFacade clienteFacade;

	private Usuario usuarioLogado;
	private Util util;

	private int menuAtual;

	public String telaInicial(){
		return TELA_INICIAL;
	}

	/**
	 * @descricao Varre o {@link Map} de erros adicionando o {@link FieldError}
	 * 			  correspondente.
	 */
	public void apresentarErros(){
		if(erros != null && erros.size() > 0){
			for (String chave : erros.keySet()) {
				addFieldError(chave, erros.get(chave));
			}
		}
	}

	/**
	 * @descricao Varre o {@link Map} de mensagens adicionando o {@link ActionMessages}
	 * 			  correspondente.
	 */
	public void apresentarMensagens(){
		if(mensagens != null && mensagens.size() > 0){
			for (String chave : mensagens.keySet()) {
				addActionMessage(mensagens.get(chave));
			}
		}
	}

	public Usuario getUsuarioLogado(){
		this.usuarioLogado = (Usuario)ActionContext.getContext().getSession().get(USUARIO_LOGADO);
		return this.usuarioLogado;
	}

	public Util getUtil(){
		if(this.util == null)
			this.util = new Util();
		return this.util;
	}
	public JasperAction getJasperAction(){
		return new JasperAction();
	}

	public MensagemFacade getMensagemFacade() {
		if(this.mensagemFacade == null){
			this.mensagemFacade = new MensagemFacade(); 
		}
		return this.mensagemFacade;
	}

	public DestinatarioFacade getDestinatarioFacade(){
		if(this.destinatarioFacade == null){
			this.destinatarioFacade = new DestinatarioFacade(); 
		}
		return this.destinatarioFacade;
	}

	public UsuarioFacade getUsuarioFacade(){
		if(usuarioFacade == null){
			this.usuarioFacade = new UsuarioFacade(); 
		}
		return usuarioFacade; 
	}

	public CidadeFacade getCidadeFacade(){
		if(cidadeFacade == null)
			this.cidadeFacade = new CidadeFacade();
		return this.cidadeFacade;
	}

	public MalaDiretaFacade getMalaDiretaFacade(){
		if(malaDiretaFacade == null)
			this.malaDiretaFacade = new MalaDiretaFacade();
		return this.malaDiretaFacade;
	}

	public PerfilFacade getPerfilFacade(){
		if(perfilFacade == null)
			this.perfilFacade = new PerfilFacade();

		return perfilFacade;
	}

	public ClienteFacade getClienteFacade(){
		if(clienteFacade == null){
			this.clienteFacade = new ClienteFacade();
		}

		return this.clienteFacade;
	}

	public UtilArquivo getUtilArquivo(){
		return new UtilArquivo();
	}

	public Map<String, String> getMensagens() {
		return mensagens;
	}

	public void setMensagens(Map<String, String> mensagens) {
		this.mensagens = mensagens;
	}

	public Map<String, String> getErros() {
		return erros;
	}

	public void setErros(Map<String, String> erros) {
		this.erros = erros;
	}

	public Map<String, Object> getSessao(){
		return ActionContext.getContext().getSession();
	}

	public HttpServletRequest getRequest(){
		return ServletActionContext.getRequest();
	}

	public int getMenuAtual() {
		return menuAtual;
	}

	public void setMenuAtual(int menuAtual) {
		this.menuAtual = menuAtual;
	}
	
	public Cliente getCliente(){
		return getUsuarioLogado().getCliente();
	}

	public boolean isAdminGeral(){
		for (Funcionalidade fu : getUsuarioLogado().getPerfil().getFuncionalidades()) {
			if(fu.getTipoFuncionalidade() == TipoFuncionalidade.ADMIN_GERAL){
				return true;
			}
		}
		return false;
	}

}
